package com.woniuxy.hotel.user.util;


import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.usermodel.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.servlet.http.HttpServletResponse;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;

import static org.apache.poi.ss.usermodel.CellType.*;

/**
 * 路径：com.example.demo.utils 类名： 功能：导入导出 备注： 创建人：typ 创建时间：2018/10/19 11:21 修改人：
 * 修改备注： 修改时间：
 */
public class ExcelUtil {
	private final static Logger log = LoggerFactory.getLogger(ExcelUtil.class);

	/**
	 * 方法名：exportExcel 功能：导出Excel 描述： 创建人：typ 创建时间：2018/10/19 16:00 修改人： 修改描述：
	 * 修改时间：
	 */
	public static void exportExcel(HttpServletResponse response, ExcelData data) {
		log.info("导出解析开始，fileName:{}", data.getFileName());
		try {
			// 实例化HSSFWorkbook
			HSSFWorkbook workbook = new HSSFWorkbook();
			// 创建一个Excel表单，参数为sheet的名字
			HSSFSheet sheet = workbook.createSheet("宾客信息");
			// 设置表头
			setTitle(workbook, sheet, data.getHead());
			// 设置单元格并赋值
			setData(sheet, data.getData());
			// 设置浏览器下载
			setBrowser(response, workbook, data.getFileName());
			log.info("导出解析成功!");
		} catch (Exception e) {
			log.info("导出解析失败!");
			e.printStackTrace();
		}
	}

	/**
	 * 方法名：setTitle 功能：设置表头 描述： 创建人：typ 创建时间：2018/10/19 10:20 修改人： 修改描述： 修改时间：
	 */
	private static void setTitle(HSSFWorkbook workbook, HSSFSheet sheet, String[] str) {
		try {
			HSSFRow row = sheet.createRow(0);
			// 设置列宽，setColumnWidth的第二个参数要乘以256，这个参数的单位是1/256个字符宽度
			for (int i = 0; i <= str.length; i++) {
				sheet.setColumnWidth(i, 16 * 256);
			}
			// 设置为居中加粗,格式化时间格式
			HSSFCellStyle style = workbook.createCellStyle();
			HSSFFont font = workbook.createFont();
			font.setBold(true);
			style.setFont(font);
			style.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy h:mm"));
			// 创建表头名称
			HSSFCell cell;
			for (int j = 0; j < str.length; j++) {
				cell = row.createCell(j);
				cell.setCellValue(str[j]);
				cell.setCellStyle(style);
			}
		} catch (Exception e) {
			log.info("导出时设置表头失败！");
			e.printStackTrace();
		}
	}

	/**
	 * 方法名：setData 功能：表格赋值 描述： 创建人：typ 创建时间：2018/10/19 16:11 修改人： 修改描述： 修改时间：
	 * 
	 * @param <T>
	 */
	private static <T> void setData(HSSFSheet sheet, List<String[]> data) {
		try {
			int rowNum = 1;
			for (int i = 0; i < data.size(); i++) {
				HSSFRow row = sheet.createRow(rowNum);
				for (int j = 0; j < data.get(i).length; j++) {
					row.createCell(j).setCellValue((String) data.get(i)[j]);
				}
				rowNum++;
			}
			log.info("表格赋值成功！");
		} catch (Exception e) {
			log.info("表格赋值失败！");
			e.printStackTrace();
		}
	}

	/**
	 * 方法名：setBrowser 功能：使用浏览器下载 描述： 创建人：typ 创建时间：2018/10/19 16:20 修改人： 修改描述：
	 * 修改时间：
	 */
	private static void setBrowser(HttpServletResponse response, HSSFWorkbook workbook, String fileName) {
		try {
			// 清空response
			response.reset();
			// 设置response的Header
			response.addHeader("Content-Disposition", "attachment;filename=" + new String(fileName.getBytes("utf-8"),"ISO8859-1"));
			OutputStream os = new BufferedOutputStream(response.getOutputStream());
			response.setContentType("application/vnd.ms-excel;charset=gb2312");
			// 将excel写入到输出流中
			workbook.write(os);
			os.flush();
			os.close();
			log.info("设置浏览器下载成功！");
		} catch (Exception e) {
			log.info("设置浏览器下载失败！");
			e.printStackTrace();
		}

	}

	/**
	 * 方法名：importExcel 功能：导入 描述： 创建人：typ 创建时间：2018/10/19 11:45 修改人： 修改描述： 修改时间：
	 */
	public static List<Object[]> importExcel(InputStream inputStream) {
		log.info("导入解析开始，fileName:{}");
		try {
			List<Object[]> list = new ArrayList<>();
			//InputStream inputStream = new FileInputStream(fileName);
			Workbook workbook = WorkbookFactory.create(inputStream);
			Sheet sheet = workbook.getSheetAt(0);
			// 获取sheet的行数
			int rows = sheet.getPhysicalNumberOfRows();
			for (int i = 0; i < rows; i++) {
				// 过滤表头行
				if (i == 0) {
					continue;
				}
				// 获取当前行的数据
				Row row = sheet.getRow(i);
				Object[] objects = new Object[row.getPhysicalNumberOfCells()];
				int index = 0;
				for (Cell cell : row) {
					if (cell.getCellType().equals(NUMERIC)) {
						objects[index] = (int) cell.getNumericCellValue();
					}
					if (cell.getCellType().equals(STRING)) {
						objects[index] = cell.getStringCellValue();
					}
					if (cell.getCellType().equals(BOOLEAN)) {
						objects[index] = cell.getBooleanCellValue();
					}
					if (cell.getCellType().equals(ERROR)) {
						objects[index] = cell.getErrorCellValue();
					}
					index++;
				}
				list.add(objects);
			}
			log.info("导入文件解析成功！");
			return list;
		} catch (Exception e) {
			log.info("导入文件解析失败！");
			e.printStackTrace();
		}
		return null;
	}

}